package nl.haemers.data.reflection 
{
	import nl.haemers.data.reflection.Type;
	/**
	 * ...
	 * @author Jonathan Haemers
	 */
	public interface IProperty 
	{
		/**
		 * Name of the Property.
		 * This could also be set through metadata.
		 */
		function get name() 			:String;
		/**
		 * Real name of the property.
		 */
		function get propertyName()		:String;
		/**
		 * dataType of the Property.
		 */
		function get dataType() 		:String;
		/**
		 * Type of the object when the property type isn't a dataType. (eg. Custom Classes)
		 */
		function get objectType()		:Type;
		
		/**
		 * Flag for the parsers if this property has to be ignored or not
		 */
		function get ignore()			:Boolean;
		/**
		 * Flag for the parsers. If is set to true the parser could keep assigning values to this property.
		 * If set to false the parser only assign a value once to this property.
		 * @default false
		 */
		function get overwriteable()	:Boolean;
		
		/**
		 * Returns if property is writeable. Eq. accessors aren't always writeable.
		 */
		function get writeable()		:Boolean;
		
		/**
		 * Metadata of the Property. Automatically is the info about the file & pos filtered.
		 */
		function get metadatas() 		:IMetadatas;
		
		/**
		 * Returns a Boolean true if the Property has a Serialize metatag.
		 * [Serialize(name="testname")]
		 * @return
		 */
		function hasSerialize() 		:Boolean;
		/**
		 * Return the String representation of the Property.
		 * @return
		 */
		function toString() 			:String;
	}
	
}